前兩篇回顧
awk - 簡介 Linux 製表好工具
awk-2 Regex搭配淺談
awk是個程式語言, 除了if else流程操作, 也有基本的運算符的支持.
# 計算a+b
awk 'BEGIN {a=1; b=3; print (a+b)}'
> 4
# 計算a%b 取糢
awk 'BEGIN {a=13; b=2; print (a%b)}'
> 1
# 透過--遞減運算; 前置遞減;
# 會把a減1, 更新回a, 再塞給b
awk 'BEGIN {a=13; b=--a; print (a, b)}'
> 12 12
# 透過--遞減運算; 後置遞減;
# 先把a塞值給b, 再把a減1, 更新回a
awk 'BEGIN {a=13; b=a--; print (a, b)}'
12 13
# 這裡動作是```a b+c```, 對awk來說空格就表示做字串拼接, 所以顯示會是1329
awk 'BEGIN {a=13; b=14; c=15; print (a b+c)}'
> 1329
# 也是先字串拼接1314再做+15, 所以也輸出1329
awk 'BEGIN {a=13; b=14; c=15; print (a b)+c}'
> 1329
# 先b*c後做字串拼接
awk 'BEGIN {a=1; b=2; c=3; print (a b*c)}'
> 16
# 先字串拼接後做b*c
awk 'BEGIN {a=1; b=2; c=3; print (a b)*c}'
> 36
# 在做b+c時, 因為b目前是字串, awk會看字串開頭是否有數字, 取出來做運算
# 這裡開頭都不是數字, 因此視為0
awk 'BEGIN {a=1; b="ithome"; c=3; print b+c}';
awk 'BEGIN {a=1; b="ithome13"; c=3; print b+c}';
> 3
> 3
# 在做b+c時, 因為b目前是字串, awk會看字串開頭是否有數字, 取出來做運算
# 這裡字串開頭有16, 因此視為b+c被視為13+3
awk 'BEGIN {a=1; b="13ithome"; c=3; print b+c}'
> 16
也有支持Array的操作, 宣告方式為arrayName[index]=value
# 存取方式arrayName[index]
awk 'BEGIN {ithome["13"]=2021;ithome["12"]=2020; print ithome["13"]}'
> 2021
# 刪除array元素, ```delete array[index]```
awk 'BEGIN {ithome["13"]=2021;ithome["12"]=2020; delete ithome["12"]; print ithome["13"], ithome["12"]} '
> 2021
# 搭配for loop, 探索並列印出array的元素
awk 'BEGIN {ithome["13"]=2021;ithome["12"]=2020; \
for (i in ithome) \
print ithome[i];}'
> 2020
> 2021
# 搭配for loop, , 探索並列印出bash array的元素
# 先宣告bash array
# 透過printf+換行符號, 將之轉換成每個元素一行
ithome=("10th" "11th" "12th" "13th");
printf '%s\n' "${ithome[@]}" | awk '{arr[NR]=$1;} END { \
pipe quote> for (i in arr) \
pipe quote> print arr[i]}'
> 12th
> 11th
> 10th
> 13th
# 隨機返回0<=N<1的值
awk 'BEGIN {print rand()}'
> 0.696453
# 返回Epoch(1970-01-01 UTC)到目前為止的秒數
awk 'BEGIN {print systime()}'
> 1631465043
# system函數可以執行指定的系統命令
# 如果正常執行且完成, 則返回0 ; 否則返回非0
awk 'BEGIN {location=system("pwd"); print location}'
> /home/nathan
> 0
vim demo.awk
# find_min有兩個參數num1, num2
# 回傳最小的一個
function find_min(num1, num2)
{
if (num1 < num2)
return num1
return num2
}
BEGIN {print find_min(10, 20)}
awk -f demo.awk
> 10